package com.example.his.api.front.impl;

import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.example.his.api.common.PageUtils;
import com.example.his.api.db.dao.GoodsDao;
import com.example.his.api.front.service.GoodsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service ( "FrontGoodsServiceImpl" )
@Slf4j
public class GoodsServiceImpl implements GoodsService {

  // 引入dao
  @Resource
  private GoodsDao goodsDao;

  /**
   * 根据商品ID查询商品详情
   *
   * @param id 商品ID
   * @return 商品信息Map，包含标签和检查项等信息；如果未找到则返回null
   */
  @Override
  @Cacheable ( cacheNames = "goods", key = "#id" )
  public HashMap searchById( int id ) {
    // 构造查询参数，只查询状态为启用的商品
    HashMap param = new HashMap <>() {{
      put( "id", id );
      put( "status", true );
    }};

    // 调用DAO层查询商品信息
    HashMap map = goodsDao.searchById( param );
    if ( map != null ) {
      // 将tag和checkup字段的JSON字符串转换为JSONArray对象
      for ( String key : new String[] { "tag", "checkup_1", "checkup_2", "checkup_3", "checkup_4" } ) {
        String temp = MapUtil.getStr( map, key );
        JSONArray array = JSONUtil.parseArray( temp );
        map.replace( key, array );
      }
      return map;
    }

    return null;
  }

  /**
   * @param partIds
   * @return
   */
  @Override
  public HashMap searchIndexGoodsByPart( Integer[] partIds ) {

    HashMap map = new HashMap <>();
    for ( int partId : partIds ) {
      ArrayList < HashMap > list = goodsDao.searchByPartIdLimit4( partId );
      map.put( partId, list );
    }

    return map;
  }

  /**
   * 分页查询商品列表
   *
   * @param param 查询参数，包含分页信息（page: 当前页码, length: 每页数量）以及其他筛选条件
   * @return PageUtils 分页结果对象，包含商品列表、总记录数、当前页码和每页数量等信息
   */
  @Override
  public PageUtils searchListByPage( Map param ) {
    // 初始化商品列表
    ArrayList < HashMap > list = new ArrayList <>();

    // 查询符合条件的商品总数
    Long count = goodsDao.searchCount( param );

    // 如果存在符合条件的商品，则查询当前页的商品列表
    if ( count > 0 ) {
      list = goodsDao.searchListByPage( param );
    }

    // 从参数中获取分页信息
    int page = MapUtil.getInt( param, "page" );
    int length = MapUtil.getInt( param, "length" );

    // 创建并返回分页工具类实例
    PageUtils pageUtils = new PageUtils( list, count, page, length );

    return pageUtils;
  }
}
